package cn.bonoon.kernel.web.controllers;

/**
 * <pre>
 * 可以定义按钮的操作状态，根据状态来限制所提交处理
 * </pre>
 * @author jackson
 *
 * @see BaseButtonResolver
 */
public class StatusButtonResolver extends BaseButtonResolver{

	protected String functionBody;
	
	/**
	 * <pre>
	 * 按钮的状态控制，指定当前操作需要被操作记录的某个字段为状态，
	 * 并且状态为指定的状态值时，该操作按钮才允许操作，否则不允许操作；
	 * 
	 * 如：账户的实体有"status"字段来表示账户的当前状态，当前是禁止
	 * 账户的操作，规定必须状态值为1(status=1)时才允许禁止，其它
	 * 状态是不允许禁止的
	 * </pre>
	 */
	protected GridButtonStatus buttonStatus;
	
	/**
	 * <pre>
	 * 注册一个javascript的事件
	 * 
	 * 被注册事件的标准格式为：
	 * &lt;script&gt;
	 * function fun_name(a){
	 *     var gridid = 'current grid's id';
	 *     //body's content...
	 * }
	 * &lt;/script&gt;
	 * 参数：
	 * a 表示所在的a标签（&lt;a&gt;&lt;/a&gt;）
	 * gridid 表示当前的grid的id
	 * 这里是在子类里注册的自定义按钮的事件，所以是具体知道了grid的类型的（如：treegrid、datagrid等）
	 * 
	 * 如果是定义在toolbar上的按钮，则方法体还可以根据当前所设定的选择类型（SelectedType）来处理选中的ID
	 * 如：SelectedType.SINGLE，可以在方法体里直接使用id这个属性，并且如果没有选中或多选，会提示异常
	 *      SelectedType.MULTIPLE，表示多选
	 * </pre>
	 * 注意：<ul>
	 *     <li>如果name和body都有值，表示定义了方法名和方法体，该方法是可以重用的，参考第3点</li>
	 *     <li>如果name为null，并且body有定义，则会自动随机生成该方法的方法名，该方法不能重用</li>
	 *     <li>如果定义了name，并且body为null，则表示重用某一个方法，这里不会再去检测该方法在前面或后面的代码被定义，如果该方法没有定义过，则客户端的javascript代码部分可能会有异常</li>
	 *     </ul>
	 * @param name
	 * @param body
	 */
	public StatusButtonResolver registerClick(String name, String body) {
		setFunctionName(name);
		functionBody = body;
		return this;
	}
	
	public GridButtonStatus getButtonStatus() {
		return buttonStatus;
	}
	 
	public StatusButtonResolver status(int... buttonStatus){
		this.buttonStatus = new GridButtonStatus(buttonStatus);
		return this;
	}
	
	public StatusButtonResolver status(GridButtonStatus buttonStatus){
		this.buttonStatus = buttonStatus;
		return this;
	}
	
	public String getFunctionBody() {
		return functionBody;
	}
}
